// 给定一个字符串 S，返回 “反转后的” 字符串，其中不是字母的字符都保留在原地，而所有字母的位置发生反转。

//  

// 示例 1：

// 输入："ab-cd"
// 输出："dc-ba"
// 示例 2：

// 输入："a-bC-dEf-ghIj"
// 输出："j-Ih-gfE-dCba"
// 示例 3：

// 输入："Test1ng-Leet=code-Q!"
// 输出："Qedo1ct-eeLg=ntse-T!"
//  

// 提示：

// S.length <= 100
// 33 <= S[i].ASCIIcode <= 122 
// S 中不包含 \ or "

#include <string>

using namespace std;

class Solution {
public:
    string reverseOnlyLetters(string S) {
        if (S.empty()) return "";
        int n = S.size();
        int lhs{0};
        int rhs{n-1};
        while (lhs < rhs) {
            if (!is_a_letter(S[lhs])) {
                ++lhs;
            } else if (!is_a_letter(S[rhs])) {
                --rhs;
            } else
                swap(S[lhs++], S[rhs--]);
        }
        return S;
    }
    bool is_a_letter(char c) {
        if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
            return true;
        }
        return false;
    }
};

class Solution {
public:
    string reverseOnlyLetters(string S) {
        int n = S.size(), i = 0, j = n - 1;
        while (i < j) {
            if (!isalpha(S[i])) ++i;
            else if (!isalpha(S[j])) --j;
            else {
                swap(S[i], S[j]);
                ++i; --j;
            }
        }
        return S;
    }
};

class Solution {
public:
    string reverseOnlyLetters(string s) {
        int n = s.size();
        int i = 0;
        int j = n - 1;
        while (i < j) {
            while (!isalpha(s[i]) && i < j) {
                ++i;
            }
            while (!isalpha(s[j]) && i < j) {
                --j;
            }
            swap(s[i++], s[j--]);
        }
        return s;
    }
};
